"""
题目：计算二叉树的最小深度（从根节点到最近叶子节点的最短路径上的节点数）。
"""


class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


def min_depth(node):
    """计算二叉树的最小深度"""
    if not node:  # 空节点深度为0 且后面的代码不再执行
        return 0
    #节点不再有左子树也不再有右子树时（即为叶子节点），深度为1
    #如果某一个节点不再有左子树和右子树，则直接return 1了，后面代码不会再执行了
    if not node.left and not node.right:
        return 1
    # 只有右子树时，返回右子树深度+1
    if not node.left:
        return 1 + min_depth(node.right)
    # 只有左子树时，返回左子树深度+1
    if not node.right:
        return 1 + min_depth(node.left)
    # 左右子树都有时，返回较小的深度+1
    return 1 + min(min_depth(node.left), min_depth(node.right))


# 辅助函数：创建二叉树（复用）
def create_binary_tree(arr):
    if not arr:
        return None
    root = TreeNode(arr[0])
    queue = [root]
    index = 1
    while queue and index < len(arr):
        current = queue.pop(0)
        if arr[index] is not None:
            current.left = TreeNode(arr[index])
            queue.append(current.left)
        index += 1
        if index < len(arr) and arr[index] is not None:
            current.right = TreeNode(arr[index])
            queue.append(current.right)
        index += 1
    return root


# 测试
root1 = create_binary_tree([3, 9, 20, None, None, 15, 7])
# 最近叶子节点是9，深度为2
print(min_depth(root1))  # 输出: 2

root2 = create_binary_tree([2, None, 3, None, 4, None, 5, None, 6])
# 只有右子树，最近叶子节点是6，深度为5
print(min_depth(root2))  # 输出: 5
